﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Controllers;
using GestorDeFlotasDesktop.Listados;

namespace GestorDeFlotasDesktop.Facturacion
{
    public partial class Facturacion : Form
    {
        public Facturacion()
        {
            InitializeComponent();
        }

        #region Propiedades
        private bool valido = true;
        private Cliente _ClienteSeleccionado;
        public Cliente ClienteSeleccionado
        {
            get { return _ClienteSeleccionado; }
            set
            {
                _ClienteSeleccionado = value;
                if (value != null)
                    txtCliente.Text = _ClienteSeleccionado.Cliente_Dni + " " + _ClienteSeleccionado.Cliente_Nombre + " " + _ClienteSeleccionado.Cliente_Apellido;
            }
        }

        private string date_from;
        private string date_to;

        private const int registrosPorPagina = 10;

        #endregion

        private void btnSeleccionarCliente_Click(object sender, EventArgs e)
        {
            var lstcliente = new lstClientes { operacion = Operacion.Seleccion, frmFacturacion = this, frm = "facturacion" };
            lstcliente.Show();
        }

        private void Facturar_Load(object sender, EventArgs e)
        {
            CargarGrilla();
        }

        private void CargarGrilla()
        {
           gvwFacturacion.AutoGenerateColumns = false;
            
            var colId = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Viaje_Fecha",
                Name = "Viaje_Fecha",
                HeaderText = "Fecha",
                ReadOnly = true,
                Width = 120
            };
            gvwFacturacion.Columns.Add(colId);

            var colRecaudacion = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Viaje_Recaudacion",
                Name = "Viaje_Recaudacion",
                HeaderText = "Consumo",
                ReadOnly = true,
                Width = 60
            };
            gvwFacturacion.Columns.Add(colRecaudacion);

            var colChofer = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Viaje_Chofer_DNI",
                Name = "Viaje_Chofer_DNI",
                HeaderText = "Chofer DNI",
                ReadOnly = true,
                Width = 100
            };
            gvwFacturacion.Columns.Add(colChofer);

            var colAuto = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Viaje_Auto_Patente",
                Name = "Viaje_Auto_Patente",
                HeaderText = "Auto Patente",
                ReadOnly = true,
                Width = 100
            };
            gvwFacturacion.Columns.Add(colAuto);


        }

        private void CalcularCantidadRegistros()
        {
            var cantidadRegistros = FacturacionController.ObtenerCantidad(_ClienteSeleccionado.Cliente_Id,date_from,date_to);

            var cantidadPaginas = cantidadRegistros / registrosPorPagina;
            if (cantidadRegistros % registrosPorPagina > 0) // if remainder is more than  zero 
            {
                cantidadPaginas += 1;
            }

            lblCantidadPaginasTotales.Text = cantidadPaginas.ToString();
        }

        private void ActualizarGrilla(int pagina)
        {
            lblCartelDe.Visible = true;
            lblPagina.Visible = true;
            lblCantidadPaginasTotales.Visible = true;
            btnUltimaPagina.Enabled = true;
            btnProximaPagina.Enabled = true;
            btnPaginaAnterior.Enabled = true;
            btnPrimeraPagina.Enabled = true;

            lblCartelPagina.Text = "Mostrando página";

            gvwFacturacion.DataSource = FacturacionController.ObtenerTodos(_ClienteSeleccionado.Cliente_Id,date_from,date_to, pagina, registrosPorPagina);

            var cantidadPaginas = Convert.ToInt32(lblCantidadPaginasTotales.Text);

            if (cantidadPaginas == 1)
            {
                btnUltimaPagina.Enabled = false;
                btnProximaPagina.Enabled = false;
                btnPaginaAnterior.Enabled = false;
                btnPrimeraPagina.Enabled = false;
            }
            else if (cantidadPaginas == 0)
            {
                btnUltimaPagina.Enabled = false;
                btnProximaPagina.Enabled = false;
                btnPaginaAnterior.Enabled = false;
                btnPrimeraPagina.Enabled = false;

                lblCartelDe.Visible = false;
                lblPagina.Visible = false;
                lblCantidadPaginasTotales.Visible = false;

                lblCartelPagina.Text = "No hay registros disponibles";
            }
            else
            {
                if (lblPagina.Text == lblCantidadPaginasTotales.Text)
                {
                    btnUltimaPagina.Enabled = false;
                    btnProximaPagina.Enabled = false;
                }
                else if (lblPagina.Text == "1")
                {
                    btnPrimeraPagina.Enabled = false;
                    btnPaginaAnterior.Enabled = false;
                }
            }
        }

        private void btnFacturar_Click(object sender, EventArgs e)
        {
            DateTime df = new DateTime(dtpDesde.Value.Year, dtpDesde.Value.Month, 1, 0, 0, 0);
            DateTime dt = df.AddMonths(1).AddMilliseconds(-1);
            date_from = String.Format("{0:M-d-yyyy HH:mm:ss}", df);
            date_to = String.Format("{0:M-d-yyyy HH:mm:ss}", dt);

            ValidarForm(sender, e);
            if (valido)
            {
                int facturaId = FacturacionController.ObtenerFacturaAnterior(_ClienteSeleccionado.Cliente_Id, date_from);
                if (facturaId != 0)
                {
                    DialogResult result = MessageBox.Show("El cliente ya ha sido facturado para el mes solicitado. Desea volver a facturarlo?", "Facturación", MessageBoxButtons.YesNo);

                    if (result == DialogResult.No)
                    {
                        return;
                    }

                }
                
                
                decimal total = FacturacionController.ObtenerFacturacionTotal(_ClienteSeleccionado.Cliente_Id, date_from, date_to);
                lblTotal.Text = "$" + total.ToString();
                lblTextoTotal.Visible = true;
                lblTotal.Visible = true;

                //Registro la facturacion en bd
                FacturacionController.RegistrarFacturacion(_ClienteSeleccionado.Cliente_Id, date_from, date_to, total.ToString().Replace(',', '.'), facturaId);

                CalcularCantidadRegistros();
                lblPagina.Text = "1";
                ActualizarGrilla(Convert.ToInt32(lblPagina.Text));
            }
            
        }

        #region Paginador
        private void btnProximaPagina_Click(object sender, EventArgs e)
        {
            var pagina = Convert.ToInt32(lblPagina.Text);
            pagina++;
            lblPagina.Text = pagina.ToString();
            ActualizarGrilla(pagina);
        }

        private void btnPaginaAnterior_Click(object sender, EventArgs e)
        {
            var pagina = Convert.ToInt32(lblPagina.Text);
            pagina--;
            lblPagina.Text = pagina.ToString();
            ActualizarGrilla(pagina);
        }

        private void btnUltimaPagina_Click(object sender, EventArgs e)
        {
            lblPagina.Text = lblCantidadPaginasTotales.Text;
            ActualizarGrilla(Convert.ToInt32(lblPagina.Text));
        }

        private void btnPrimeraPagina_Click(object sender, EventArgs e)
        {
            lblPagina.Text = "1";
            ActualizarGrilla(Convert.ToInt32(lblPagina.Text));
        }
        #endregion

        private void btnSeleccionar_Validated(object sender, EventArgs e)
        {
            if (_ClienteSeleccionado == null)
            {
                errProvider.SetError(btnSeleccionarCliente, "Debe seleccionar un cliente");
                valido = false;
            }
            else
            {
                errProvider.SetError(btnSeleccionarCliente, "");
            }
        }

        private void ValidarForm(object sender, EventArgs e)
        {
            valido = true;
            btnSeleccionar_Validated(sender, e);
            dtpDesde_Validated(sender, e);
        }

        private void dtpDesde_Validated(object sender, EventArgs e)
        {
            if (dtpDesde.Value > DateTime.Today || (dtpDesde.Value.Year == DateTime.Today.Year && dtpDesde.Value.Month == DateTime.Today.Month))
            {
                errProvider.SetError(dtpDesde, "Debe seleccionar un mes que haya culminado");
                valido = false;
            }
            else
            {
                errProvider.SetError(dtpDesde, "");
            }
        }
    }
}
